package com.css.fxfzdzzh.modules.basicData.controller;

import com.css.fxfzdzzh.base.response.RestResponse;
import com.css.fxfzdzzh.constants.FxfzConstants;
import com.css.fxfzdzzh.modules.basicData.entity.SysDataVersion;
import com.css.fxfzdzzh.modules.basicData.param.PageQueryParam;
import com.css.fxfzdzzh.modules.basicData.param.SysDataVersionSameTypeDataExistParam;
import com.css.fxfzdzzh.modules.basicData.param.SysDataVersionSaveMetaDataInfoParam;
import com.css.fxfzdzzh.modules.basicData.param.sysDataVersion.SysDataVersionPageParam;
import com.css.fxfzdzzh.modules.basicData.service.impl.*;
import com.css.fxfzdzzh.modules.basicData.vo.QueryByVersionParam;
import com.css.fxfzdzzh.modules.basicData.vo.SysDataVersionFileVO;
import com.css.fxfzdzzh.util.ResponseCreator;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * @author Dbj
 * @date 2023年02月25日  14:05
 * 版本管理的接口
 * */
@Slf4j
@RestController
@RequestMapping("/sysDataVersion/")
public class SysDataVersionController {

    @Autowired
    private SysDataVersionService sysDataVersionService;

    @Resource
    LandformService landformService;

    @Resource
    NaturalDensityService  naturalDensityService;

    @Resource
    SensingImageService sensingImageService;

    @Resource
    SeismotectionService seismotectionService;
    /**
     * 保存新版本
     * */
    @PostMapping("saveNewVersion")
    public RestResponse saveNewVersion(@RequestBody SysDataVersion sysDataVersion) {
        try {
            return RestResponse.succeed(sysDataVersionService.saveNewVersion(sysDataVersion));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail("新增失败!");
        }
    }

    /**
     * 覆盖旧版本
     * */
    @PostMapping("overwriteOldVersion")
    public RestResponse overwriteOldVersion(@RequestBody SysDataVersion sysDataVersion) {
        try {
            return RestResponse.succeed(sysDataVersionService.overwriteOldVersion(sysDataVersion));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail(e.getMessage());
        }
    }

    //1时 是获取 地形地貌坡度  为2时 是获取地形地貌坡向
    /**
     * 获取版本列表
     * dataType2 ：hpygyx 是获取滑坡遥感影像解译数据 为dm时 是获取地貌数据 为trmd时 是获取天然密度数据
     * belt为地震构造数据地震带；
     * zone为地震构造数据地震构造区；
     *
     * map參數：province省；city市；area县区；dataRangeCountry数据范围，1-国家级，2-省级；versionCode版本号;dataType2
     *
     * */
    @GetMapping("getVersionCodeList")
    //public RestResponse getVersionCodeListByType(@PathVariable("dataType") String dataType2) {
    public RestResponse getVersionCodeListByType(@RequestParam Map<String,Object> map) {
        return RestResponse.succeed(sysDataVersionService.getVersionCodeListByType(map));
    }

    /**
     * 查询版本列表信息
     */
    @GetMapping("getVersionList")
    public RestResponse getVersionList(@RequestParam Map<String,Object> map) {
        return RestResponse.succeed(sysDataVersionService.getVersionList(map));
    }


    /**
     * 根据版本编号查询数据版本列表接口（无分页）
     * */
    @GetMapping("list")
    public RestResponse list(SysDataVersionPageParam sysDataVersionPageParam) {
        try {
            return RestResponse.succeed(sysDataVersionService.list(sysDataVersionPageParam));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail("查询失败!");
        }
    }

    /**
     * 根据版本号查询业务数据信息
     * typeCode2为hpygyx时 是获取滑坡遥感影像解译数据 为dm时 是获取地貌数据 为trmd时 是获取天然密度数据 为belt地震带 ；为zone地震构造区
     * */
    @GetMapping("getYwData")
    public RestResponse getYwData(QueryByVersionParam param) {
        String typeCode = param.getTypeCode2();
        //滑坡遥感影响业务数据
        if (typeCode.equals(FxfzConstants.HPYGYX)){
            return sensingImageService.getYwData(param);
        }
        //地貌业务数据
        if (typeCode.equals(FxfzConstants.DM)){
            return landformService.getYwData(param);
        }
        //天然密度数据
        if (typeCode.equals(FxfzConstants.TRMD)){
            return naturalDensityService.getYwData(param);
        }
        //地震构造-地震带
        if (typeCode.equals(FxfzConstants.BELT)){
            return seismotectionService.getBeltYwData(param);
        }
        //地震构造-地震构造区
        if (typeCode.equals(FxfzConstants.ZONE)){
            return seismotectionService.getZoneYwData(param);
        }
        return RestResponse.succeed();
    }

    /**
     * 根据版本号查询业务数据信息
     * typeCode2为dm时 是获取地貌数据 为trmd时 是获取天然密度数据
     * */
    @PostMapping("getYwDataByGeom")
    public RestResponse getYwDataByGeom(@RequestBody QueryByVersionParam param) {
        String typeCode = param.getTypeCode2();
        //地貌业务数据
        if (typeCode.equals(FxfzConstants.DM)){
            return landformService.getYwData(param);
        }
        //天然密度数据
        if (typeCode.equals(FxfzConstants.TRMD)){
            return naturalDensityService.getYwData(param);
        }
        return RestResponse.succeed();
    }
    /**
     *保存元数据信息
     * */
    @PostMapping("saveMetaDataInfo")
    public RestResponse saveMetaDataInfo(@RequestBody SysDataVersionSaveMetaDataInfoParam param) {
        try {
            sysDataVersionService.saveMetaDataInfo(param);
            return RestResponse.succeed();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail("保存失败!");
        }
    }

    /**
     * 根据版本号查询元数据信息
     * */
    @GetMapping("getMetaDataByVersionCode/{versionCode}")
    public RestResponse getMetaDataByVersionCode(@PathVariable("versionCode") String versionCode) {
        try {
            return RestResponse.succeed(sysDataVersionService.getMetaDataByVersionCode(versionCode));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail("查询失败!");
        }
    }

    /**
     * 删除版本数据
     * */
    @PostMapping("del")
    public RestResponse del(@RequestBody String id) {
        try {
            sysDataVersionService.delByIds(Collections.singletonList(id));
            return RestResponse.succeed();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail(e.getMessage());
        }
    }

    /**
     * 批量删除版本数据
     * */
    @PostMapping("delByIds")
    public RestResponse delByIds(@RequestBody String ids) {
        try {
            String[] arr= ids.split(",");
            List<String> idList = Arrays.asList(arr);
            sysDataVersionService.delByIds(idList);
            return RestResponse.succeed();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail(e.getMessage());
        }
    }

    /**
     * 分页条件查询接口
     * */
    @GetMapping("page")
    public RestResponse page(SysDataVersionPageParam sysDataVersionPageParam) {
        try {
            return RestResponse.succeed(sysDataVersionService.page(sysDataVersionPageParam));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail("查询失败!");
        }
    }



    /*
     * 解析Shp 文件
     * */
    @GetMapping("parseShp")
    public RestResponse parseShp(String fileIds,String typeCode) {
        try {
            return sysDataVersionService.parseShp(fileIds,typeCode);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail(e.getMessage());
        }
    }

    /**
     * 根据省市区 类型 版本 查询数据
     * */
    @PostMapping("getDataView")
    public RestResponse getDataView(@RequestBody SysDataVersionPageParam sysDataVersionPageParam) {
        return RestResponse.succeed(sysDataVersionService.getDataVersionView(sysDataVersionPageParam));
    }
    /**
     * 判断同类别数据是否已经存在  根据数据分类二级判断
     * */
    @GetMapping("sameTypeDataExist")
    public RestResponse sameTypeDataExist(SysDataVersionSameTypeDataExistParam sysDataVersionSameTypeDataExistParam) {
        try {
            return RestResponse.succeed(sysDataVersionService.sameTypeDataExist(sysDataVersionSameTypeDataExistParam));
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail("查询失败!");
        }
    }

    /**
     * 分页条件查询
     * @param pageParam
     * @return
     */
    @GetMapping("getPage")
    public RestResponse getPage(PageQueryParam pageParam) {
        return ResponseCreator.createSuccessResponse(sysDataVersionService.getPage(pageParam));
    }

    /**
     * 查询一级数据类别和它的第二级数据类别的树
     *
     * @return
     */
    @ApiOperation("查询一级数据类别和它的第二级数据类别的树接口")
    @GetMapping("getDataTypeLevel2AndDataTypeLevel3Tree")
    public RestResponse getDataTypeLevel1AndDataTypeLevel2Tree(@RequestParam String dictCode) {
        try {
            return RestResponse.succeed(sysDataVersionService.getDataTypeLevel1AndDataTypeLevel2Tree(dictCode));
        } catch (Exception v1) {
            log.error(v1.getMessage(), v1);
            return RestResponse.fail("查询失败!");
        }
    }

    /**
     * 获取字段说明
     * typeCode2为hpygyx时 是获取滑坡遥感影像解译数据 为dm时 是获取地貌数据 为trmd时 是获取天然密度数据 为belt地震带 ；为zone地震构造区
     */
    @Operation(summary = "获取字段说明")
    @GetMapping("getFileDesc/{typeCode2}")
    public RestResponse getFileDesc(@PathVariable("typeCode2") String typeCode2) {
        try {
            return sysDataVersionService.getFileDesc(typeCode2);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.fail("查询失败!");
        }
    }

    /**
     * 根据版本号查询附件和数据文件信息
     */
    @GetMapping("getFileMessage/{versionCode}")
    public RestResponse getFileMessage(@PathVariable("versionCode") String versionCode) {
//        return ResponseCreator.createSuccessResponse(sysDataVersionService.getFileMessage(versionCode));
        SysDataVersionFileVO sysDataVersionFileVO = sysDataVersionService.getFileMessage(versionCode);
        if(sysDataVersionFileVO==null){
            return ResponseCreator.createFailResponse("版本"+versionCode+"数据已删除，请重新选择版本！");
        }
        return ResponseCreator.createSuccessResponse(sysDataVersionService.getFileMessage(versionCode));
    }

    /**
     * 根据版本号查询附件和数据文件信息
     */
    @GetMapping("getFilePathByVersion")
    public RestResponse getFilePathByVersion(@RequestParam("versionCode") String versionCode) {
        return ResponseCreator.createSuccessResponse(sysDataVersionService.getFilePathByVersion(versionCode));
    }

    /**
     * 查询业务数据的详细信息
     */
    @GetMapping("getYwDetails")
    public RestResponse getYwDetails(@RequestParam String typeCode,@RequestParam String id) {
        return ResponseCreator.createSuccessResponse(sysDataVersionService.getYwDetails(typeCode,id));
    }

    /**
     * 业务数据分页条件查询接口
     * */
    @GetMapping("getYwVesrionData")
    public RestResponse getYwVesrionData(PageQueryParam pageQueryParam) {
        return ResponseCreator.createSuccessResponse(sysDataVersionService.getYwVesrionData(pageQueryParam));
    }

}
